#include <stdio.h>
#ifdef WIN32
#include <curses.h>
#else
#include <ncurses.h>
#endif
#include <assert.h>
#include <time.h>
#include "jeux.h"
#include "Liste.h"


void ncursAff( WINDOW* win, const Jeu *pJeu, Liste *l1)
{
    int x,y;

    ElemListe e;

    const Arene *pArene = jeuGetConstArenePtr(pJeu);
    const Snake *pSnake = jeuGetConstSnakePtr(pJeu);

    affectation(l1,pSnake->queu);

    wclear(win);

    for(x=0; x<getDimX(pArene); ++x)
        for(y=0; y<getDimY(pArene); ++y)
            mvwprintw( win, y, x, "%c", areneGetXY(pArene,x,y));
    /*mvwprintw( win, 15, 1, "%d",pSnake->longeur);*/
    while(!estVide(l1))
    {
        e=getPremierElemListe(l1);
        mvwprintw(win, elemGetY(e), elemGetX(e), "o" );
        suppressionEnTete(l1);
    }
    wmove( win, snakeGetY(pSnake), snakeGetX(pSnake));
    /*mvwprintw(win, elemGetY(e), elemGetX(e), "%d",elemGetY(e));*/
}

void ncursBoucle(Jeu *pJeu)
{
    WINDOW *win, *screen;
    int c;
    int continue_boucle;

    /* Horloges (en secondes) */
    float horloge_courante, horloge_precedente;

    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
    /* Changer la valeur pour ralentir ou accélérer le déplacement des fantomes */
    float intervalle_horloge = 0.08f;
    Liste *l1 = (Liste*) malloc (sizeof(Liste));
    screen = initscr();		/* passe l'écran texte en mode NCurses */
    clear();		/* efface l'écran */
    noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pas a à l'écran */
    cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */

    /* Creation d'une nouvelle fenetre en mode texte */
    /* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
    win = newwin( getDimY(jeuGetConstArenePtr(pJeu)), getDimX(jeuGetConstArenePtr(pJeu)), 10, 5);
    keypad(win, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */

    /* halfdelay(temps_dizieme);*/
    /* notimeout(win,true);*/
    /*wtimeout( win, 500 );*/
    nodelay(win,true); /* Pour que l'appel à wgetch soit non-bloquant */
    continue_boucle = 1;

    /* Récupère l'horloge actuelle et la convertit en secondes */
    /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;

    ncursAff(win, pJeu, l1);

    do
    {
        /* Récupère l'horloge actuelle et la convertit en secondes */
        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;
        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
            jeuEvolue(pJeu);
            ncursAff( win, pJeu,l1);
            horloge_precedente = horloge_courante;
            c = wgetch(win);
            switch(c)
            {
            case KEY_LEFT:
                jeuActionClavier( pJeu, 'g');
                ncursAff( win, pJeu,l1);
                break;
            case KEY_RIGHT:
                jeuActionClavier( pJeu, 'd');
                ncursAff( win, pJeu,l1);
                break;
            case KEY_UP:
                jeuActionClavier( pJeu, 'h');
                ncursAff( win, pJeu,l1);
                break;
            case KEY_DOWN:
                jeuActionClavier( pJeu, 'b');
                ncursAff( win, pJeu,l1);
                break;
            case 27: /* ECHAP */
                continue_boucle = 0;
                break;
            }
           /* while(getch(c)!='\n');*/
        }
    }while (continue_boucle==1);
    free(l1);
    assert(delwin(win)!=ERR);
    assert(delwin(screen)!=ERR);

    endwin();
}
